package com.imut.lagain.service;
import org.slf4j.LoggerFactory;

import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 邮件服务接口
 * 提供邮件发送功能
 */
public interface IEmailService {
    
    /**
     * 发送简单文本邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @return 是否发送成功
     */
    boolean sendSimpleEmail(String to, String subject, String content);
    
    /**
     * 发送HTML邮件
     * @param to 收件人
     * @param subject 主题
     * @param htmlContent HTML内容
     * @return 是否发送成功
     */
    boolean sendHtmlEmail(String to, String subject, String htmlContent);
    
    /**
     * 发送模板邮件
     * @param to 收件人
     * @param subject 主题
     * @param templateName 模板名称
     * @param variables 模板变量
     * @return 是否发送成功
     */
    boolean sendTemplateEmail(String to, String subject, String templateName, Map<String, Object> variables);
    
    /**
     * 异步发送简单文本邮件
     * @param to 收件人
     * @param subject 主题
     * @param content 内容
     * @return CompletableFuture<Boolean>
     */
    CompletableFuture<Boolean> sendSimpleEmailAsync(String to, String subject, String content);
    
    /**
     * 异步发送HTML邮件
     * @param to 收件人
     * @param subject 主题
     * @param htmlContent HTML内容
     * @return CompletableFuture<Boolean>
     */
    CompletableFuture<Boolean> sendHtmlEmailAsync(String to, String subject, String htmlContent);
    
    /**
     * 异步发送模板邮件
     * @param to 收件人
     * @param subject 主题
     * @param templateName 模板名称
     * @param variables 模板变量
     * @return CompletableFuture<Boolean>
     */
    CompletableFuture<Boolean> sendTemplateEmailAsync(String to, String subject, String templateName, Map<String, Object> variables);
    
    /**
     * 发送验证码邮件
     * @param to 收件人
     * @param username 用户名
     * @param verificationCode 验证码
     * @return 是否发送成功
     */
    boolean sendVerificationEmail(String to, String username, String verificationCode);
    
    /**
     * 发送欢迎邮件
     * @param to 收件人
     * @param username 用户名
     * @return 是否发送成功
     */
    boolean sendWelcomeEmail(String to, String username);
    
    /**
     * 发送密码重置邮件
     * @param to 收件人
     * @param username 用户名
     * @param resetToken 重置令牌
     * @return 是否发送成功
     */
    boolean sendPasswordResetEmail(String to, String username, String resetToken);
    
    /**
     * 发送胶囊开启通知邮件
     * @param to 收件人
     * @param username 用户名
     * @param capsuleTitle 胶囊标题
     * @param openTime 开启时间
     * @return 是否发送成功
     */
    boolean sendCapsuleOpenNotification(String to, String username, String capsuleTitle, LocalDateTime openTime);
    
    /**
     * 发送胶囊开启提醒邮件
     * @param to 收件人
     * @param username 用户名
     * @param capsuleTitle 胶囊标题
     * @param openTime 开启时间
     * @param daysLeft 剩余天数
     * @return 是否发送成功
     */
    boolean sendCapsuleOpenReminder(String to, String username, String capsuleTitle, LocalDateTime openTime, int daysLeft);
    
    /**
     * 发送系统通知邮件
     * @param to 收件人
     * @param username 用户名
     * @param title 通知标题
     * @param content 通知内容
     * @return 是否发送成功
     */
    boolean sendSystemNotification(String to, String username, String title, String content);
    
    /**
     * 发送系统维护通知邮件
     * @param to 收件人
     * @param username 用户名
     * @param maintenanceTime 维护时间
     * @param duration 维护时长
     * @param reason 维护原因
     * @return 是否发送成功
     */
    boolean sendMaintenanceNotification(String to, String username, LocalDateTime maintenanceTime, String duration, String reason);
    
    /**
     * 发送安全警告邮件
     * @param to 收件人
     * @param username 用户名
     * @param alertType 警告类型
     * @param alertContent 警告内容
     * @param alertTime 警告时间
     * @return 是否发送成功
     */
    boolean sendSecurityAlert(String to, String username, String alertType, String alertContent, LocalDateTime alertTime);
    
    /**
     * 获取邮件发送状态
     * @return 邮件服务是否可用
     */
    boolean isEmailServiceAvailable();
}
